﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.IO;
using System.Xml;
using System.Text.RegularExpressions;

namespace INTREPWCF
{
    public class IntrepService : IIntrepService
    {
        private static DadosString datastring;
        private static XmlDocument doc;
        private string basepath = AppDomain.CurrentDomain.BaseDirectory;

        public string recebeString(String _stringBalanca)
        {
            Regex regex = new Regex(@"82SP(?<dados>\d{2}.\d{2}.\d{2}\|\d{2}:\d{2}\|\d{2}\|.?\|\d{2}\|\d+?\|\d+?\|\-?\d+?\|.+?\|\d+?\|\d+?\|)");            

            if (regex.IsMatch(_stringBalanca))
            {
                Match match = regex.Match(_stringBalanca);

                string[] _balancada = match.Groups["dados"].Value.Split('|');

                trataString(_balancada);

                return "true" + AppDomain.CurrentDomain.BaseDirectory.ToString();
            }
            else
                return "false";
        }

        private void trataString(string[] _stringseparada)
        {
            datastring = new DadosString();


            datastring.Data = _stringseparada[0];
            datastring.Hora = _stringseparada[1];
            datastring.Balanca = _stringseparada[2];
            datastring.NL = _stringseparada[3];
            datastring.Porao = _stringseparada[4];
            datastring.Sequencial = _stringseparada[5];
            datastring.PesoBruto = _stringseparada[6];
            datastring.Tara = _stringseparada[7];
            datastring.Fluxo = _stringseparada[8];
            datastring.SubtotalPorao = _stringseparada[9];
            datastring.TotalGeral = _stringseparada[10];

            criaXML(datastring);
        }

        private void criaXML(DadosString _datastring)
        {
            string caminhoXmlSubtotal =  Path.Combine(basepath, "totalporhora.xml");

            doc = new XmlDocument();
            // Se o arquivo já existir, carregue-o.
            if (File.Exists(caminhoXmlSubtotal))
            {                
                doc.Load(caminhoXmlSubtotal);
            }
            else
            {
                // Se não existir, crie um novo e salve no disco.
                XmlDeclaration declaracao = doc.CreateXmlDeclaration("1.0", "utf-8", null);
                XmlElement raiz = doc.CreateElement("Embarque");

                doc.InsertBefore(declaracao, doc.DocumentElement);
                doc.AppendChild(raiz);
                doc.Save(caminhoXmlSubtotal);
            }

            XmlNode balancaatual = doc.SelectSingleNode("/Embarque/Balanca[@Id='" + _datastring.Balanca + "']");
            // Se já existir uma entrada para esta balança, use-a. Se não, crie uma nova entrada.
            if (balancaatual == null)
            {
                balancaatual = (XmlElement)doc.DocumentElement.AppendChild(doc.CreateElement("Balanca"));
                XmlAttribute id = doc.CreateAttribute("Id");
                id.Value = _datastring.Balanca;
                balancaatual.Attributes.Append(id);
            }

            XmlNode ultimapesagem = balancaatual.LastChild;
            TimeSpan tempocorrido = new TimeSpan();
            // Selecione a última pesagem. Se existir uma, apenas atualize-a
            if (ultimapesagem != null)
            {
                DateTime ultimadata = DateTime.Parse(ultimapesagem.Attributes["Data"].Value + " " + ultimapesagem.Attributes["Hora"].Value);
                tempocorrido = _datastring.DataHora - ultimadata;
            
                // Se não houver passado 1 hora desde a última pesagem, apenas atualize o peso
                // TODO Alterar para Horas
                if (tempocorrido.Minutes < 1)
                {
                    int pesoanterior = Convert.ToInt32(ultimapesagem.InnerText);
                    int novopeso = Convert.ToInt32(_datastring.PesoBruto);
                    ultimapesagem.InnerText = (pesoanterior + novopeso).ToString();
                }
                else
                    NovaPesagem(balancaatual); // Caso tenha passado mais de uma hora.
            }
            else
                NovaPesagem(balancaatual); // Caso não exista uma última pesagem.

            doc.Save(caminhoXmlSubtotal);
        }

        private static void NovaPesagem(XmlNode balancaatual)
        {
            if (balancaatual.ChildNodes.Count >= 11)
            {
                balancaatual.RemoveChild(balancaatual.FirstChild);
            }
            XmlElement pesagem = (XmlElement)balancaatual.AppendChild(doc.CreateElement("Pesagem"));
            pesagem.SetAttribute("Data", datastring.DataHora.ToShortDateString());
            pesagem.SetAttribute("Hora", datastring.DataHora.ToShortTimeString());
            XmlText peso = (XmlText)pesagem.AppendChild(doc.CreateTextNode(datastring.PesoBruto));
        }
    }
}
